﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Adp.Pleiade.Fwk.Batch;
using Adp.Pleiade.Fwk.Common;
using System.Data.SqlClient;
using Adp.Pleiade.Fwk.Entity;

namespace Pleiade.Mtr // à compléter
{
    public class ClassicBatchActivityFromDB : BatchActivity<StandartBatchSession>
    {
        private RecordList elementsATraiter;
        private RecordList[] elementsATraiterTableau;
        private int rest;
        
        #region Implémentations obligatoires

        /// <summary>
        /// Chargement des données dans un RecordList
        /// </summary>
        protected override void DoPrepareData()
        {
            // définition des structures de données
            elementsATraiter = new RecordList();
            elementsATraiterTableau = new RecordList[ProcessCount];

            // définition de la requête de sélection, si ce n'est pas une procédure stockée
            string requeteSelection = String.Empty;
            elementsATraiter = LoadSQLCmd(Adp.Pleiade.Fwk.Common.DataBase.Alias.Pleiade, requeteSelection);          

            // si c'est une procédure stockée, définition des paramètres
            var spDefinition = new Tuple<string, SqlParameter[]>(
                "dbo.NomDePS",
                new SqlParameter[2] 
                { 
                    StoredProceduresManager.CreateParameter("@Param1", "VALEUR 1"),
                    StoredProceduresManager.CreateParameter("@Param2", "VALEUR 2")
                }
            );
            elementsATraiter = LoadStoredProcedure(Adp.Pleiade.Fwk.Common.DataBase.Alias.Pleiade, spDefinition.Item1, spDefinition.Item2); 

            // détermination du reste à traiter initial
            rest = (elementsATraiter.RowCount > 0) ? elementsATraiter.RowCount : 0;
        }

        /// <summary>
        /// Découpage des données
        /// </summary>
        /// <param name="aSessionIndex">fourni par la plateforme</param>
        protected override void DoSplitData(int aSessionIndex)
        {
            int crtPack = (aSessionIndex == ProcessCount - 1) ? rest : rest / (ProcessCount - aSessionIndex);

            rest -= crtPack;
            elementsATraiterTableau[aSessionIndex] = Split(elementsATraiter, crtPack);
        }

        /// <summary>
        /// Détermine si on est à la fin du traitement
        /// </summary>
        /// <param name="aSessionIndex">fourni par la platefome</param>
        /// <returns></returns>
        protected override bool IsEndOfData(int aSessionIndex)
        {
            return (elementsATraiterTableau[aSessionIndex] == null) ? true : elementsATraiterTableau[aSessionIndex].EOF;
        }

        /// <summary>
        /// Passage du paquet suivant
        /// </summary>
        /// <param name="aSessionIndex"></param>
        /// <returns></returns>
        protected override IPackage NextData(int aSessionIndex)
        {
            var aCDS = Split(elementsATraiterTableau[aSessionIndex], PackSize);

            return new BusinessPackage(aCDS)
            {
                // assigner les valeurs aux membres
            };
        }

        #endregion

        #region Implémentations recommandées

        protected override void DoSetDynamicParameters()
        {
            // récupération des paramètres du batch, s'ils existent
        }

        #endregion
    }

    //public class BusinessPackage : RecordList
    //{
    //    // déclaration des membres

    //    public BusinessPackage(RecordList recordList)
    //    {
    //        this.InitWith(recordList);
    //    }
    //}
}
